﻿/**
 * @file DriverStruct.cpp
 * @brief 设备驱动程序相关数据结构的实现
 * @details 实现设备属性管理、端口掩码操作、栈数据结构等功能
 */

#include "DriverStruct.h"
#include "C0C_Def.h"
#include <cstring>
#include <algorithm>

// 定义COM端口数据库最大仲裁端口数
#define COMDB_MAX_PORTS_ARBITRATED 4096

// ============================================================================
// DeviceProperties 类实现
// ============================================================================

/**
 * @brief 默认构造函数，初始化所有成员为空
 */
DeviceProperties::DeviceProperties()
    : deviceId(), physicalObjectName(), location() {
}

/**
 * @brief 拷贝构造函数，深拷贝所有字符串成员
 * @param other 要拷贝的对象
 */
DeviceProperties::DeviceProperties(const DeviceProperties& other) 
    : deviceId(), physicalObjectName(), location() {
    *this = other;
}

/**
 * @brief 析构函数，智能指针自动管理内存释放
 */
DeviceProperties::~DeviceProperties() {
    // 智能指针自动释放内存，无需手动操作
}

/**
 * @brief 赋值操作符，深拷贝所有字符串成员
 * @param other 要赋值的对象
 * @return 当前对象的引用
 */
DeviceProperties& DeviceProperties::operator=(const DeviceProperties& other) {
    if (this != &other) {
        deviceId = other.getDeviceId();
        physicalObjectName = other.getPhysicalObjectName();
        location = other.getLocation();
    }
    return *this;
}

/**
 * @brief 设置设备ID
 * @param deviceId 设备ID字符串
 * @return 设置后的设备ID指针
 */
void DeviceProperties::setDeviceId(const QString& deviceId) {
    this->deviceId = deviceId;
}

/**
 * @brief 设置物理对象名称
 * @param objectName 物理对象名称
 * @return 设置后的物理对象名称指针
 */
void DeviceProperties::setPhysicalObjectName(const QString& objectName) {
    this->physicalObjectName = objectName;
}

/**
 * @brief 设置设备位置信息
 * @param location 位置信息字符串
 * @return 设置后的位置信息指针
 */
void DeviceProperties::setLocation(const QString& location) {
    this->location = location;
}

/**
 * @brief 检查是否为空
 * @return 如果所有属性都为空则返回true
 */
bool DeviceProperties::isEmpty() const {
    return deviceId.isEmpty() && physicalObjectName.isEmpty() && location.isEmpty();
}

/**
 * @brief 清空所有属性
 */
void DeviceProperties::clear() {
    deviceId.clear();
    physicalObjectName.clear();
    location.clear();
}

// ============================================================================
// PortBusyMask 类实现
// ============================================================================

/**
 * @brief 默认构造函数，初始化掩码为空
 */
PortBusyMask::PortBusyMask() : pBusyMask(nullptr), maskLength(0) {
}

/**
 * @brief 析构函数，释放掩码内存
 */
PortBusyMask::~PortBusyMask() {
    clear();
}

/**
 * @brief 清空所有掩码数据
 */
void PortBusyMask::clear() {
    if (pBusyMask) {
        LocalFree(pBusyMask);
        pBusyMask = nullptr;
        maskLength = 0;
    }
}

/**
 * @brief 添加端口号到忙碌列表
 * @param portNumber 端口号
 * @return 操作成功返回true
 */
bool PortBusyMask::addBusyPort(int portNumber) {
    ULONG maskNum = portNumber/(sizeof(*pBusyMask)*8);

    if (maskNum >= maskLength) {
        SIZE_T newBusyMaskLen = maskNum + 1;
        PBYTE pNewBusyMask;

        if (!pBusyMask)
            pNewBusyMask = (PBYTE)LocalAlloc(LPTR, newBusyMaskLen);
        else
            pNewBusyMask = (PBYTE)LocalReAlloc(pBusyMask, newBusyMaskLen, LMEM_ZEROINIT|LMEM_MOVEABLE);

        if (pNewBusyMask) {
            pBusyMask = pNewBusyMask;
            maskLength = newBusyMaskLen;
        } else {
            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
            return FALSE;
        }
    }

    ULONG mask = 1 << (portNumber%(sizeof(*pBusyMask)*8));
    pBusyMask[maskNum] |= mask;
    return TRUE;
}

/**
 * @brief 从忙碌列表中移除端口号
 * @param portNumber 端口号
 */
void PortBusyMask::removeBusyPort(int portNumber) {
    ULONG maskNum = portNumber/(sizeof(*pBusyMask)*8);

    if (maskNum >= maskLength)
        return;

    ULONG mask = 1 << (portNumber%(sizeof(*pBusyMask)*8));

    pBusyMask[maskNum] &= ~mask;
}

/**
 * @brief 检查端口是否空闲
 * @param portNumber 端口号
 * @return 端口空闲返回true，忙碌返回false
 */
bool PortBusyMask::isPortFree(int portNumber) const {
    ULONG maskNum = portNumber/(sizeof(*pBusyMask)*8);

    if (maskNum >= maskLength)
        return TRUE;

    ULONG mask = 1 << (portNumber%(sizeof(*pBusyMask)*8));

    return (pBusyMask[maskNum] & mask) == 0;
}

/**
 * @brief 获取第一个空闲端口号
 * @return 第一个空闲的端口号
 */
int PortBusyMask::getFirstFreePort() const {
    int num;
    for (num = 0 ; !isPortFree(num) ; num++)
        ;
    return num;
}

/**
 * @brief 检查端口是否忙碌
 * @param portNumber 端口号（从1开始）
 * @return 端口忙碌返回true，空闲返回false
 */
bool PortBusyMask::isPortBusy(int portNumber) const {
    return !isPortFree(portNumber);
}

// ============================================================================
// SimpleStack 类实现
// ============================================================================

/**
 * @brief 析构函数，清理所有元素
 */
SimpleStack::~SimpleStack() {
    while (!isEmpty()) {
        delete pop();
    }
}

/**
 * @brief 压入元素到栈顶
 * @param element 要压入的元素
 * @return 操作成功返回true
 */
bool SimpleStack::push(StackElement* element) {
    if (!element) {
        return false;
    }

    element->next = top;
    top = element;
    return true;
}

/**
 * @brief 弹出栈顶元素
 * @return 栈顶元素指针，栈为空时返回nullptr
 */
StackElement* SimpleStack::pop() {
    if (!top) {
        return nullptr;
    }

    StackElement* topElement = top;
    top = top->next;
    topElement->next = nullptr;
    return topElement;
}

/**
 * @brief 获取栈中元素数量
 * @return 元素数量
 */
size_t SimpleStack::size() const {
    size_t count = 0;
    StackElement* current = top;
    while (current) {
        ++count;
        current = current->next;
    }
    return count;
}

// ============================================================================
// 结构体构造函数实现
// ============================================================================

/**
 * @brief DeviceEnumParams 默认构造函数，初始化所有成员为默认值
 */
DeviceEnumParams::DeviceEnumParams() 
    : targetProperties(nullptr)
    , callback(nullptr)
    , callbackParam(nullptr)
    , deviceStack(nullptr)
    , deviceCount(0)
    , rebootRequired(0) {
}

/**
 * @brief DeviceParams 构造函数
 * @param enumParams 枚举参数指针
 */
DeviceParams::DeviceParams(DeviceEnumParams* enumParams) 
    : enumParams(enumParams) {
}
